<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	
</body>
<script>
	// function fn(){
	// 	var a =2;
	// 	return function (){
	// 		a++;
	// 		console.log(a)
	// 	}
	// }
	// var f1 = fn(); //指向匿名函数
	// // f1();
	// f1();
	// f1();  
	// f1=null
	// var f2 = fn();
	// f2();
	// f2();
	// f2();
	// 一般认为函数执行完毕，变量就会释放，但是由于js引擎发现匿名函数要使用a变量，所有a变量并不能得到释放，a会存在于f1可以访问到的地方，此时a变量只能被f1访问
	// 上下文调用 call apply
	// 异同？
	//不同的地方：传参的形式不同//
	//相同的地方：都可以改变函数内部的this的值

	// function f1(){
	// 	console.log(this)
	// }
	// //call方法的第一个参数决定了函数内部的this
	// f1.call([1,2,3])
	// f1.call({age:16,name:"jack"})
	// f1.call(2)
	// f1.call('abc')
	// f1.call(true)
	// f1.call(undefined)
	// f1.call(null)
	// 总结：call方法的第一个参数，
	// 	1、如果是一个对象类型，那么函数内部的this指向该对象
	// 	2、如果是undefined,null 那么函数内部的this指向window
	// 	3、如果是数字 this==>对应的Number构造函数的实例 new Number(1)
	// 		字符串  new String('abc')
	// 		布尔值  new Boolean(false)


	// 	上述完全可以用apply代替
	// 	// 判断数据类型
	// 	typeof  object 
	// 	Object.prototype.toString.call()

	//es6  在es6之前  函数内部的this是由函数的调用方式决定  
		//和书写位置无关

		// 1、函数调用 git 你们每次 只用更新即可 省的我每次都发 你们每次都接受 也不知道 放在那里 搞混淆  
			var age = 23
			var p = {
				age:14,
				say:function(){
					console.log(this.age) window
				}
			}
			var s1 = p.say;
			s1() 

			2、方法调用

			var age = 23
			var p = {
				age:14,
				say:function(){
					console.log(this.age) p
				}
			}
			p.say()
			
			3、new 调用（构造函数） 

			new p.say()
			值是undefined ？？
			因为new 调用 返回值没有  所以返回该构造函数的实例，this中不存在age属性  又因为我们知道访问一个对象不存在的属性时 值为undefined
			 故此例子返回值为 undefined

			 es6常用 重点
			 模板字符串  结构赋值  函数的拓展 箭头函数  对象的拓展  promise async class  module

</script>
</html>